Skip to content

分享你的应用 (Sharing Your App)

创建完 Gradio 应用后,你可能希望与他人分享。Gradio 提供了多种方式来分享你的应用,从快速的临时链接到永久托管方案。

1. 临时公共链接 (share=True)

最快捷的分享方式是在 launch() 方法中设置 share=True。这会生成一个 .gradio.live 的公共链接,任何人都可以通过这个链接在浏览器中访问你的应用,有效期通常为 72 小时。

python
import gradio as gr

def greet(name):
    return "Hello " + name + "!"

demo = gr.Interface(fn=greet, inputs="text", outputs="text")

# demo.launch(share=True) # 取消注释以生成公共链接
  • 工作原理:这个链接通过 SSH 隧道连接到你的本地服务器。Gradio 的共享服务器仅作为代理,不会存储任何通过应用发送的数据。
  • 注意事项:由于链接是公开的,请确保你的应用不会暴露敏感信息或允许对你的设备进行有害操作。你可以考虑为应用添加身份验证
  • 默认行为:除了在 Google Colab Notebooks 中,share 参数默认为 False,即应用仅在本地运行。

2. 在局域网内分享

如果你想在本地网络(例如,与同一 Wi-Fi 网络下的同事)分享应用,可以在 launch() 时将 server_name 设置为 "0.0.0.0"

python
# demo.launch(server_name="0.0.0.0", server_port=7860) # 使用你机器的局域网 IP 和指定端口访问

其他用户可以通过你的计算机在局域网中的 IP 地址和指定的端口(默认为 7860)来访问应用,例如 http://192.168.1.XX:7860

3. 永久托管在 Hugging Face Spaces

如果你需要一个永久的在线链接,Hugging Face Spaces 是一个绝佳的选择。它为 Gradio 应用提供了免费的托管服务。

有两种主要方式将应用部署到 Spaces:

  1. 使用 Gradio CLI:在你的应用目录下运行 gradio deploy。CLI 会引导你完成部署过程。你可以之后通过再次运行此命令或设置 GitHub Actions 来更新 Space。
  2. 通过网页界面:在 Hugging Face 网站上创建一个新的 Space,然后拖拽包含你的 app.py 和其他所需文件的文件夹进行上传。

参考 Hugging Face 关于托管的指南 获取更详细信息。

4. 嵌入到其他网页

一旦你的应用托管在 Hugging Face Spaces 或你自己的服务器上,你可以将其嵌入到其他网站,如博客或作品集。

使用 Web Components (推荐)

Web Components 通常提供比 iFrames 更好的用户体验,它们支持懒加载并且能自动调整高度。

  1. 在你的网站中引入 Gradio 的 JavaScript 库:

    html
    <script
        type="module"
        src="https://gradio.s3-us-west-2.amazonaws.com/{GRADIO_VERSION}/gradio.js"
    ></script>

    (请将 {GRADIO_VERSION} 替换为你使用的 Gradio 版本)

  2. 在你想要嵌入应用的地方添加 <gradio-app> 标签:

    html
    <gradio-app src="https://YOUR_SPACE_HOST.hf.space"></gradio-app>

    或者,如果应用托管在 Hugging Face Spaces,可以使用简写:

    html
    <gradio-app space="username/space_name"></gradio-app>

    <gradio-app> 标签支持多种属性以自定义外观和行为,例如 initial_height, theme_mode, autoscroll 等。

使用 iFrames

如果无法使用 JavaScript,你可以使用 iFrame:

html
<iframe src="https://YOUR_SPACE_HOST.hf.space" width="100%" height="500px" style="border:0;"></iframe>

你需要手动设置 height,并可能需要通过 allow 属性授予摄像头或麦克风等权限。

5. 通过 API 使用

大多数 Gradio 应用都会自动提供 API 接口。在应用页脚通常会有一个 "Use via API" 的链接,点击后可以看到可用的 API 端点以及如何通过 gradio_client (Python) 或 @gradio/client (JavaScript) 调用它们。

对于 gr.Blocks 应用,你可以为事件监听器指定 api_name 来命名 API 端点:

python
import gradio as gr

def add(a, b):
    return a + b

with gr.Blocks() as demo:
    num1 = gr.Number()
    num2 = gr.Number()
    output = gr.Number()
    btn = gr.Button("Add")
    btn.click(add, [num1, num2], output, api_name="addition")

# demo.launch() # 访问 /api/addition/ 来调用

6. 挂载到 FastAPI 应用

如果你有一个现有的 FastAPI 应用,可以将 Gradio 应用挂载到特定路径下:

python
from fastapi import FastAPI
import gradio as gr

fastapi_app = FastAPI()

@fastapi_app.get("/")
def read_main():
    return {"message": "This is your main FastAPI app"}

def greet(name):
    return "Hello " + name + "!"

gradio_app = gr.Interface(fn=greet, inputs="text", outputs="text")

app = gr.mount_gradio_app(fastapi_app, gradio_app, path="/gradio")

# 使用 uvicorn 启动: uvicorn main:app --reload
# 然后访问 http://localhost:8000/gradio

7. 部署到自己的服务器

对于生产环境,你可能希望将 Gradio 应用部署到自己的服务器上,通常会结合 Docker 和反向代理 (如 Nginx) 进行部署。

  • Dockerize:创建一个 Dockerfile 来打包你的应用及其依赖。
  • Nginx/Apache:配置 Web 服务器作为反向代理,处理 SSL、负载均衡等。

这通常涉及到更高级的部署策略,具体配置取决于你的服务器环境和需求。

8. 身份验证

Gradio 支持多种身份验证方法来保护你的应用:

  • 简单密码保护:在 launch() 中使用 auth=("username", "password") 或一个包含多个用户凭据元组的列表。
    python
    # demo.launch(auth=("admin", "securepassword123"))
  • 自定义认证函数:传递一个函数给 auth 参数,该函数接收用户名和密码,返回 True (允许访问) 或 False (拒绝访问)。
  • OAuth (通过 Hugging Face):通过在 Space 的 README.md 中配置 hf_oauth: true 并使用 gr.LoginButton(),可以实现 "Sign in with Hugging Face" 功能。
  • 外部 OAuth 提供商:结合 FastAPI 挂载和 auth_dependency,可以集成如 Google OAuth 等外部提供商。

9. 其他注意事项

  • 深层链接 (Deep Links):使用 gr.DeepLinkButton() 组件可以在应用中创建一个按钮,生成一个包含当前所有组件状态的唯一 URL。这对于分享特定的应用状态或结果非常有用。
  • 文件访问与安全:了解 Gradio 如何处理文件访问权限 (allowed_paths, blocked_paths) 以及文件上传大小限制 (max_file_size) 非常重要,以确保应用的安全性。
  • 渐进式 Web 应用 (PWA):通过设置 launch(pwa=True),可以将 Gradio 应用作为 PWA 提供,允许用户将其"安装"到设备上。

选择合适的分享和部署方法取决于你的具体需求,例如应用的受众、安全性要求以及是否需要永久托管等。